<?php
/**
 * Tydny Model for Ohlasky Component
 *
 * @license		GNU/GPL
 */

// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.model');

/**
 * mista  Model
 */
class OhlaskysModelTydny extends JModel
{
    /**
     * Constructor that retrieves the ID from the request
     *
     * @access	public
     * @return	void
     */
    function __construct()
    {
        parent::__construct();

        $array = JRequest::getVar('cid',  0, '', 'array');
        $this->setId((int)$array[0]);
    }

    /**
     * Method to set the mista identifier
     *
     * @access	public
     * @param	int mista identifier
     * @return	void
     */
    function setId($id)
    {
        // Set id and wipe data
        $this->_id		= $id;
        $this->_data	= null;
    }

    /**
     * Method to get a mista
     * @return object with data
     */
    function &getData()
    {
        // Load the data
        if (empty( $this->_data )) {
            $query = ' SELECT * FROM #__tydny '.
                    '  WHERE id = '.$this->_id;
            $this->_db->setQuery( $query );
            $this->_data = $this->_db->loadObject();
            if (!empty($this->_data)) {
                $this->_data->barvy_obj_arr = $this->getBarvy_obj_arr();
            }
        }
        if (!$this->_data) {
            //získáme číslo týdne, který má být vytvořen a rok
            $c_tyd_rok_den_arr = $this->getCisl_ty_rok_den();
            if (!is_array($c_tyd_rok_den_arr)) {
                //datum nebylo zadano rucne, ziskame nejblizsi
                //volny tyden, pokud takovy neni, tak aktualni tyden
                $c_tyd_rok_den_arr = $this->getNejblVolTyden();
            }
            $doplnovat_katol_kalen = false;
            if ((is_array($c_tyd_rok_den_arr)) && (!empty($c_tyd_rok_den_arr))) {
                $nastaveni_obj = $this->getNastaveni();
                $this->_data = new stdClass();
                $this->_data->id = 0;
                $this->_data->tyden_cislo = $c_tyd_rok_den_arr['cislo_tydne_int'];
                $this->_data->rok = $c_tyd_rok_den_arr['rok_int'];
                $this->_data->ode_dne = $c_tyd_rok_den_arr['ode_dne'];
                $this->_data->sablony_obj_arr = $this->getSablony_arr();
                $po_dateTime_obj = new DateTime($c_tyd_rok_den_arr['ode_dne']);
                //zjistime, zda mame doplnovat katolicke kalendarium
                if (is_object($nastaveni_obj)) {
                    if ($nastaveni_obj->katolicke_kalendarium == 'Ano') {
                        $doplnovat_katol_kalen = true;
                    }
                }
                if ($doplnovat_katol_kalen == true) {
                    //doplnime katolicke kalendarium
                    $datum_obj = new DateTime($c_tyd_rok_den_arr['ode_dne']);
                    $this->_data->litur_po = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_ut = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_st = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_ct = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_pa = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_so = $this->getKatolKalendDne($datum_obj);
                    $datum_obj->modify("+1 day");
                    $this->_data->litur_ne = $this->getKatolKalendDne($datum_obj);

                } else {
                    $this->_data->litur_po = null;
                    $this->_data->litur_ut = null;
                    $this->_data->litur_st = null;
                    $this->_data->litur_ct = null;
                    $this->_data->litur_pa = null;
                    $this->_data->litur_so = null;
                    $this->_data->litur_ne = null;
                }
                $this->_data->barva_po = null;
                $this->_data->barva_ut = null;
                $this->_data->barva_st = null;
                $this->_data->barva_ct = null;
                $this->_data->barva_pa = null;
                $this->_data->barva_so = null;
                $this->_data->barva_ne = null;
                $this->_data->zverejnen = null;
                $this->_data->barvy_obj_arr = $this->getBarvy_obj_arr();
            }

        }
        return $this->_data;
    }

    //vraci nejvyssi id (integer)
    //nebo nulu
    function getNejvyssiId() {
        $id_int = 0;
        $query = ' SELECT * FROM #__tydny ORDER BY #__tydny.id DESC LIMIT 1';
        $this->_db->setQuery( $query );
        $nejvysTyden_obj = $this->_db->loadObject();
        if (is_object($nejvysTyden_obj)) {
            $id_int = $nejvysTyden_obj->id;
        }
        return $id_int;
    }

    //vraci pole objektu tridy Sablony,
    //pokud je vytvorena alespon jedna sablona,
    //jinak vraci null
    function getSablony_arr() {
        $query = ' SELECT * FROM #__sablony';
        $this->_db->setQuery( $query );
        $sablony_obj_arr = $this->_db->loadObjectList();
        if (empty($sablony_obj_arr)) {
            return null;
        } else {
            return $sablony_obj_arr;
        }
    }

    /**
     * Method to store a record
     *
     * @access	public
     * @return	boolean	True on success
     */
    function store()
    {
        $this->getCisl_ty_rok_den();
        $row =& $this->getTable();

        $data = JRequest::get( 'post' );

        // Bind the form fields to the mista table
        if (!$row->bind($data)) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Make sure the mista record is valid
        if (!$row->check()) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Store the web link table to the database
        if (!$row->store()) {
            $this->setError( $row->getError() );
            return false;
        }

        return true;
    }

    /**
     * Method to delete record(s)
     *
     * @access	public
     * @return	boolean	True on success
     */
    //misto nelze vymazat, metoda nebude pouzivana
    function delete()
    {
        $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );

        $row =& $this->getTable();

        //		if (count( $cids )) {
        //			foreach($cids as $cid) {
        //				if (!$row->delete( $cid )) {
        //					$this->setError( $row->getErrorMsg() );
        //					return false;
        //				}
        //			}
        //		}
        return true;
    }


    //vraci asociativni pole('cislo_tydne_int'=>int, 'rok_int'=>int, 'ode_dne'=>str YYYY-MM-DD)
    //nebo null pri selhani;
    //slouzi k ziskani zkontrolovanych hodnot, pri rucnim zadani datumu
    //zadane hodnoty se kontroluji v kontrolleru tyden_rucne
    function getCisl_ty_rok_den() {
        $hodnoty_nalezeny_bool = false;
        $cisl_ty_rok_den_arr = array();
        $chyba = '';
        $tyden_cislo_rucne = JRequest::getVar('tyden_cislo_rucne',  0);
        $rok_rucne = JRequest::getVar('rok_rucne',  0);
        $ode_dne_rucne = JRequest::getVar('ode_dne_rucne',  '');
        $dateTime_obj = date_create($ode_dne_rucne);
        if ((empty($tyden_cislo_rucne)) || (empty($rok_rucne)) || (empty($ode_dne_rucne))) {
            $chyba = 'Z kontrolleru tyden_rucne nebyly predany vsechny potrebne hodnoty!';
        }
        if (empty($chyba)) {
            //zkontroluje hodnoty predane controllerem tyden_rucne
            //z "ode_dne" vytvorime datum
            if (!is_object($dateTime_obj)) {
                $chyba = 'Z kontroleru tyden_rucne bylo predano spatne datum - interni chyba!';
            } else {
                $cislo_dne_tydne = $dateTime_obj->format('N');
                if ($cislo_dne_tydne != '1') {
                    $chyba = 'Hodnota ode_dne neni pondeli - interni chyba!';
                } else {
                    //kontrolujeme, zda "ode_dne" souhlasi s predanym rokem
                    $rok_ode_dne_str = $dateTime_obj->format('Y');
                    $rok_rucne_str = strval($rok_rucne);
                    if ($rok_ode_dne_str != $rok_rucne_str) {
                        $chyba = 'Nesouhlasi predany rok a ode_dne - interni chyba!';
                    } else {
                        //zjistime zda souhlasi tyden a ode dne
                        $tyden_ode_dne_str = $dateTime_obj->format('W');
                        $tyden_rucne_str = strval($tyden_cislo_rucne);
                        if ($tyden_ode_dne_str != $tyden_rucne_str) {
                            $chyba = 'Nesouhlasi cislo tydne a ode_dne - interni chyba!';
                        }
                    }
                }
            }
        }
        if (empty($chyba)) {
            $neni_stejny_tyden_bool = $this->neexistujeStejnyTyden($dateTime_obj);
            if (!$neni_stejny_tyden_bool) {
                $chyba = 'Stejný týden již existuje - interní chyba!';
            }
        }
        if (empty($chyba)) {
            $cisl_ty_rok_den_arr['cislo_tydne_int'] = intval($tyden_cislo_rucne);
            $cisl_ty_rok_den_arr['rok_int'] = intval($rok_rucne);
            $cisl_ty_rok_den_arr['ode_dne'] = $ode_dne_rucne;
            return $cisl_ty_rok_den_arr;
        } else {
            return null;
        }

    }


    function getNejblVolTyden() {
        $hodnoty_nalezeny_bool = false;
        $cisl_ty_rok_den_arr = array();
        if ($hodnoty_nalezeny_bool == false) {
            //najdeme nejblizsi volny tyden po vytvorenem tydnu nejvyssiho data
            $query3 = ' SELECT * FROM #__tydny '.
                    'ORDER BY rok desc, tyden_cislo desc';

            $this->_db->setQuery( $query3 );
            $tyden_obj = $this->_db->loadObject();
            if (is_object($tyden_obj)) {
                $pristi_pondeli_obj = new DateTime($tyden_obj->ode_dne);
                $pristi_pondeli_obj->modify("+7 day");
                $uspech_kontroly_bool = $this->existujeLiPosun($pristi_pondeli_obj);
                //vytvorime data pro pondeli nasledujici po posledne ulozenem tydnu
                $cisl_ty_rok_den_arr['cislo_tydne_int'] = intval($pristi_pondeli_obj->format("W"));
                $cisl_ty_rok_den_arr['rok_int'] = intval($pristi_pondeli_obj->format("Y"));
                $cisl_ty_rok_den_arr['ode_dne'] = $pristi_pondeli_obj->format('Y-m-d');
                $hodnoty_nalezeny_bool = true;
            }
        }
        if ($hodnoty_nalezeny_bool == false) {
            //žádný týden ještě nebyl uložen, tvoříme první
            $dateTime_obj = new DateTime();
            $uspesna_zmena_bool = $this->zmenDatumNaPondeli($dateTime_obj);
            if ($uspesna_zmena_bool) {
                $uspech_kontroly_bool = $this->existujeLiPosun($dateTime_obj);
                $cisl_ty_rok_den_arr['cislo_tydne_int'] = intval($dateTime_obj->format("W"));
                $cisl_ty_rok_den_arr['rok_int'] = intval($dateTime_obj->format("Y"));
                $cisl_ty_rok_den_arr['ode_dne'] = $dateTime_obj->format('Y-m-d');
                $hodnoty_nalezeny_bool = true;
            }
        }
        return $cisl_ty_rok_den_arr;
    }

    //ocekava objekt tridy DateTime,
    //pokud tyden zacinajici stejnym datumem
    //jiz je v databazi, posunuje datum az
    //nalezne volny tyden
    //vraci true/false
    function neexistujeStejnyTyden(&$dateTime_obj) {
        $stejny_neexistuje_bool = false;
        if (is_object($dateTime_obj)) {
            //zkontrolujeme zda je datum pondeli, pripadne upravime
            $uspesna_zmena_bool = $this->zmenDatumNaPondeli($dateTime_obj);
            if ($uspesna_zmena_bool) {
                //zjistime zda tyden zacinajici stejnym pondelkem
                //jiz neni v databazi
                $cisl_ty_int = intval($dateTime_obj->format("W"));
                $rok_int = intval($dateTime_obj->format("Y"));
                $query5 = ' SELECT * FROM #__tydny '.
                    '  WHERE #__tydny.tyden_cislo = '.$cisl_ty_int. '
                        AND #__tydny.rok = '.$rok_int;
                $this->_db->setQuery( $query5 );
                $tyden_obj = $this->_db->loadObject();
                if (!(is_object($tyden_obj))) {
                    $stejny_neexistuje_bool = true;
                }
            }
        }
        return $stejny_neexistuje_bool;
    }

    //nacte nastaveni, vrati nastaveni jako objekt
    function getNastaveni() {
        $query = ' SELECT * FROM #__nastaveni ';
        $this->_db->setQuery( $query );
        $nastaveni_obj = $this->_db->loadObject();
        return $nastaveni_obj;
    }

    //nacte seznam barev pro den ohlasek,
    //vraci seznam objektu
    function getBarvy_obj_arr() {
        $query = ' SELECT * FROM #__barvy ';
        $this->_db->setQuery( $query );
        $barvy_obj_list = $this->_db->loadObjectList();
        return $barvy_obj_list;
    }

    //vraci retezec s kalendariem nebo prazdny retezec
    //priorita liturgickych dnu dle Breviare:
    //1.
    //Velikonocni Triduum
    //2.
    //Narozeni, Zjeveni, Nanebevstoupeni Pane, Seslani Ducha sv.,
    //nedele adventni, postni, velikonocni
    //popelecni streda, PO, UT, ST, CT Svateho tydne
    //dny v oktavu velikonocnim
    //3.
    //Slavnosti Pane, Panny Marie a svatych, vzpominka na verne zemrele
    //4.
    //Vlastni Slavnosti (patron mesta, posvíceni, zakladatele kongr.)
    //5.
    //Svatky Pane
    //6.
    //Nedele v dobe Vanocni a v mezidobi
    //7.
    //Svatky Panny Marie a svatych
    //8.
    //Vlastni svatky patrona dieceze, posveceni katedraly,
    //uzemniho patrona
    //9.
    //Adventni vsedni dny od 17. do 24. prosince, dny v oktavu Narozeni Pane,
    //Vsedni dny doby postni
    //10.
    //zavazne pamatky
    //11.
    //vlastni zavazne pamatky
    //12.
    //nezavazne pamatky
    //13.
    //vsedni dny doby adventni do 16.prosince, vsedni dny doby vanocni od
    //2.ledne do soboty po Zjeveni Pane, vsedni dny doby velikonocni od pondeli
    //po velik.oktavu do soboty pred Letnicemi,
    //vsedni dny litur.mezidobi
    //KONFLIKT SLAVNOSTI:
    //stretne-li se nekolik oslav, slavi se ta, ktera je na prednejsim miste, pokud musi ustoupit
    //slavnost, presouva se na nejblizsi den, ktery neni obsazen nekterym liturgickym dnem
    //v oddile 1-8 tabulky - v ostatnich pripadech se oslava v tomto roce vynecha
    //vyse uvedene je liturgicky predpis,
    //pro zjednoduseni vlastni liturgii ignorujeme, dale body 9/ a 13/ tabulky
    //*******************************
    //ocekava objekt tridy DateTime, vraci text nebo prazdny retezec
    function getKatolKalendDne($datum_obj) {
        $chyba = '';
        $text_dne = '';
        if (is_object($datum_obj)) {
            //zjistime den tydne
            $cislo_dne_tydne_str = $datum_obj->format('N');
            //Velikonocni Triduum
            $text_dne = $this->jeToDenSkup1($datum_obj);
            //Narozeni, Zjeveni, Nanebevstoupeni Pane, Seslani Ducha sv.,
            //nedele adventni, postni, velikonocni
            //popelecni streda, PO, UT, ST, CT Svateho tydne
            //dny v oktavu velikonocnim
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup2($datum_obj);
            }
            //Slavnosti Pane, Panny Marie a svatych, vzpominka na verne zemrele
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup3($datum_obj);
            }
            //Vlastni Slavnosti (patron mesta, posvíceni, zakladatele kongr.)
            //            $je_den_skup_4 = $this->jeToDenSkup4($datum_obj);
            //            if ($je_den_skup_4 == true) {
            //                $text_dne = getTextDneSkup4($datum_obj);
            //                return $text_dne;
            //            }
            //Svatky Pane
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup5($datum_obj);
            }
            //Nedele v dobe Vanocni a v mezidobi
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup6($datum_obj);
            }
            //Svatky Panny Marie a svatych
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup7($datum_obj);
            }
            //Vlastni svatky patrona dieceze, posveceni katedraly,
            //uzemniho patrona
            //            $je_den_skup_8 = $this->jeToDenSkup8($datum_obj);
            //            if ($je_den_skup_8 == true) {
            //                $text_dne = getTextDneSkup8($datum_obj);
            //                return $text_dne;
            //            }
            //Adventni vsedni dny od 17. do 24. prosince, dny v oktavu Narozeni Pane,
            //Vsedni dny doby postni
            //            if (empty($text_dne)) {
            //                $text_dne = $this->jeToDenSkup9($datum_obj);
            //                if (!empty($text_dne)) {
            //                    return $text_dne;
            //                }
            //            }
            //zavazne pamatky
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup10($datum_obj);
            }
            //vlastni zavazne pamatky
            //            $je_den_skup_11 = $this->jeToDenSkup11($datum_obj);
            //            if ($je_den_skup_11 == true) {
            //                $text_dne = getTextDneSkup11($datum_obj);
            //                return $text_dne;
            //            }
            //nezavazne pamatky
            if (empty($text_dne)) {
                $text_dne = $this->jeToDenSkup12($datum_obj);
            }
            //vsedni dny doby adventni do 16.prosince, vsedni dny doby vanocni od
            //2.ledne do soboty po Zjeveni Pane, vsedni dny doby velikonocni od pondeli
            //po velik.oktavu do soboty pred Letnicemi,
            //vsedni dny litur.mezidobi
            //            if (empty($text_dne)) {
            //                $text_dne = $this->jeToDenSkup13($datum_obj);
            //                if (!empty($text_dne)) {
            //                    return $text_dne;
            //                }
            //            }
        } else {
            $chyba = 'Chyba: nebylo předáno datum jako objekt třídy DateTime';
        }
        return $text_dne;
    }

    //Velikonocni Triduum
    function jeToDenSkup1(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $datum_velik_obj = $this->getDatumVelikObj($datum_obj);
            if (is_object($datum_velik_obj)) {
                $den_test_int = intval($datum_obj->format('z'));
                $den_velik_int = intval($datum_velik_obj->format('z'));
                $rozdil_dnu_int = $den_velik_int - $den_test_int;
                if (($rozdil_dnu_int >= 0) && ($rozdil_dnu_int < 4)) {
                    //je to den z Tridua
                    switch ($rozdil_dnu_int) {
                        case 0:
                            $text_dne = 'Slavnost Zmrtvýchvstání Páně';
                            break;
                        case 1:
                            $text_dne = 'Bílá sobota';
                            break;
                        case 2:
                            $text_dne = 'Velký pátek';
                            break;
                        case 3:
                            $text_dne = 'Zelený čtvrtek';
                            break;
                    }
                }
            }
        }
        return $text_dne;
    }

    //Narozeni, Zjeveni, Nanebevstoupeni Pane, Seslani Ducha sv.,
    //nedele adventni, postni, velikonocni, kvetna
    //popelecni streda, PO, UT, ST, CT Svateho tydne
    //dny v oktavu velikonocnim
    function jeToDenSkup2(&$datum_obj) {
        $text_dne = '';
        $chyba = '';
        if (is_object($datum_obj)) {
            //test Narozeni Pane
            $den_mesic_str = $datum_obj->format('d.m.');
            $datum_velik_obj = $this->getDatumVelikObj($datum_obj);
            if (!is_object($datum_velik_obj)) {
                $chyba = 'Chyba: Selhalo získání data velikonoc!';
            }
            if ($den_mesic_str == '25.12.') {
                $text_dne = 'Slavnost Narození Páně';
            }
            if (empty($text_dne)) {
                //Zjeveni Pane
                if ($den_mesic_str == '06.01.') {
                    $text_dne = 'Slavnost Zjevení Páně';
                }
            }
            if (empty($text_dne)) {
                //Seslani Ducha sv.
                $den_test_int = intval($datum_obj->format('z'));
                $den_velik_int = intval($datum_velik_obj->format('z'));
                $rozdil_dnu_int = $den_test_int - $den_velik_int;
                if ($rozdil_dnu_int == 49) {
                    $text_dne = 'Slavnost Seslání Ducha Svatého';
                }
            }
            if (empty($text_dne) && empty($chyba)) {
                //Nanebevstoupení Páně
                $den_test_int = intval($datum_obj->format('z'));
                $den_velik_int = intval($datum_velik_obj->format('z'));
                $rozdil_dnu_int = $den_test_int - $den_velik_int;
                if ($rozdil_dnu_int == 39) {
                    $text_dne = 'Slavnost Nanebevstoupení Páně';
                }
            }
            if (empty($text_dne) && empty($chyba)) {
                //nedele adventni, postni, velikonocni, kvetna
                $cislo_dne = $datum_obj->format('N');
                if ($cislo_dne == '7') {
                    //kvetna nedele
                    $den_test_int = intval($datum_obj->format('z'));
                    $den_velik_int = intval($datum_velik_obj->format('z'));
                    $rozdil_dnu_int = $den_velik_int - $den_test_int;
                    if ($rozdil_dnu_int == 7) {
                        $text_dne = 'Květná neděle';
                    }
                    if (empty($text_dne)) {
                        //nedele velikonocni
                        $den_test_int = intval($datum_obj->format('z'));
                        $den_velik_int = intval($datum_velik_obj->format('z'));
                        $rozdil_dnu_int = $den_test_int - $den_velik_int;
                        if (($rozdil_dnu_int > 6) && ($rozdil_dnu_int < 49)) {
                            switch ($rozdil_dnu_int) {
                                case 7:
                                    $text_dne = '2. neděle velikonoční';
                                    break;
                                case 14:
                                    $text_dne = '3. neděle velikonoční';
                                    break;
                                case 21:
                                    $text_dne = '4. neděle velikonoční';
                                    break;
                                case 28:
                                    $text_dne = '5. neděle velikonoční';
                                    break;
                                case 35:
                                    $text_dne = '6. neděle velikonoční';
                                    break;
                                case 42:
                                    $text_dne = '7. neděle velikonoční';
                                    break;
                            }
                        }
                    }
                    if (empty($text_dne)) {
                        //neděle postni
                        $den_test_int = intval($datum_obj->format('z'));
                        $den_velik_int = intval($datum_velik_obj->format('z'));
                        $rozdil_dnu_int = $den_velik_int - $den_test_int;
                        if (($rozdil_dnu_int > 13) && ($rozdil_dnu_int < 49)) {
                            switch ($rozdil_dnu_int) {
                                case 14:
                                    $text_dne = '5. neděle postní';
                                    break;
                                case 21:
                                    $text_dne = '4. neděle postní';
                                    break;
                                case 28:
                                    $text_dne = '3. neděle postní';
                                    break;
                                case 35:
                                    $text_dne = '2. neděle postní';
                                    break;
                                case 42:
                                    $text_dne = '1. neděle postní';
                                    break;
                            }
                        }
                    }
                    if (empty($text_dne)) {
                        //nedele adventni
                        $datum_1ne_adv_obj = $this->getDatum1NeAdvenObj($datum_obj);
                        if (is_object($datum_1ne_adv_obj)) {
                            $den_test_int = intval($datum_obj->format('z'));
                            $den_1NeAdv_int = intval($datum_1ne_adv_obj->format('z'));
                            $rozdil_dnu_int = $den_test_int - $den_1NeAdv_int;
                            if (($rozdil_dnu_int >= 0) && ($rozdil_dnu_int < 29)) {
                                switch ($rozdil_dnu_int) {
                                    case 0:
                                        $text_dne = '1. neděle adventní';
                                        break;
                                    case 7:
                                        $text_dne = '2. neděle adventní';
                                        break;
                                    case 14:
                                        $text_dne = '3. neděle adventní';
                                        break;
                                    case 21:
                                        $text_dne = '4. neděle adventní';
                                        break;
                                }
                            }
                        }
                    }
                }
            }
            if (empty($text_dne) && empty($chyba)) {
                //popelecni streda, PO, UT, ST Svateho tydne
                //popelecni streda
                $cislo_dne_str = $datum_obj->format('N');
                if ($cislo_dne_str == '3') {
                    $den_test_int = intval($datum_obj->format('z'));
                    $den_velik_int = intval($datum_velik_obj->format('z'));
                    $rozdil_dnu_int = $den_velik_int - $den_test_int;
                    if ($rozdil_dnu_int == 46) {
                        $text_dne = 'Popeleční středa';
                    }
                }
                if (empty($text_dne)) {
                    //PO, UT, ST Svateho tydne
                    $den_test_int = intval($datum_obj->format('z'));
                    $den_velik_int = intval($datum_velik_obj->format('z'));
                    $rozdil_dnu_int = $den_velik_int - $den_test_int;
                    switch ($rozdil_dnu_int) {
                        case 4:
                            $text_dne = 'středa svatého týdne';
                            break;
                        case 5:
                            $text_dne = 'úterý svatého týdne';
                            break;
                        case 6:
                            $text_dne = 'pondělí svatého týdne';
                            break;
                    }
                }
            }
            if (empty($text_dne) && empty($chyba)) {
                //dny velikonocniho oktavu
                $den_test_int = intval($datum_obj->format('z'));
                $den_velik_int = intval($datum_velik_obj->format('z'));
                $rozdil_dnu_int = $den_test_int - $den_velik_int;
                if (($rozdil_dnu_int > 0) && ($rozdil_dnu_int < 7)) {
                    switch ($rozdil_dnu_int) {
                        case 1:
                            $text_dne = 'pondělí velikonoční';
                            break;
                        case 2:
                            $text_dne = 'úterý velikonoční';
                            break;
                        case 3:
                            $text_dne = 'středa velikonoční';
                            break;
                        case 4:
                            $text_dne = 'čtvrtek velikonoční';
                            break;
                        case 5:
                            $text_dne = 'pátek velikonoční';
                            break;
                        case 6:
                            $text_dne = 'sobota velikonoční';
                            break;
                    }
                }
            }
        }
        return $text_dne;
    }

    //Slavnosti Pane, Panny Marie a svatych, vzpominka na verne zemrele
    //Nejsv.Trojice (NE po Letnicich),
    //Tela a Krve Pane (CT po Nejsv.Trojice), Nejsv.Srdce Jezisova (PA po 2.NE po Letnicich),
    //Jezise Krista Krale (posl.nedele cirk.roku)
    function jeToDenSkup3(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            //dusicky
            $datum_str = $datum_obj->format('j.m.');
            if ($datum_str == '2.11.') {
                $text_dne = 'Památka všech věrných zemřelých';
            }
            if (empty($text_dne)) {
                //je-li PO 20.3., pak je na toto datum presunuta slavnost
                //sv.Josefa
                $cislo_dne_tydne_str = $datum_obj->format('N');
                if (($cislo_dne_tydne_str == '1') && ($datum_str == '20.3.')) {
                    $text_dne = 'Slavnost sv. Josefa';
                }
            }
            if (empty($text_dne)) {
                //slavnosti s pevnym datumem - hledame v databazi
                $den_str = $datum_obj->format('j');
                $mesic_str = $datum_obj->format('n');
                $query4 = ' SELECT * FROM #__svatky '.
                    '  WHERE den = "'.$den_str.'" AND mesic = "'.$mesic_str.'" AND stupen = "slav"';
                $this->_db->setQuery( $query4 );
                $svatek_obj = $this->_db->loadObject();
                if (is_object($svatek_obj)) {
                    $text_dne = $svatek_obj->svatek;
                }
            }
            if (empty($text_dne)) {
                //pohyblive svatky okolo Letnic
                $datum_velik_obj = $this->getDatumVelikObj($datum_obj);
                if (is_object($datum_velik_obj)) {
                    $den_test_int = intval($datum_obj->format('z'));
                    $den_velik_int = intval($datum_velik_obj->format('z'));
                    $rozdil_dnu_int = $den_test_int - $den_velik_int;
                    if (($rozdil_dnu_int > 55) && ($rozdil_dnu_int < 69)) {
                        switch ($rozdil_dnu_int) {
                            case 56:
                                $text_dne = 'Slavnost Nejsvětější Trojice';
                                break;
                            case 60:
                                $text_dne = 'Slavnost Těla a Krve Páně';
                                break;
                            case 68:
                                $text_dne = 'Slavnost Nejsvětějšího Srdce Ježíšova';
                                break;
                        }
                    }
                }
            }
            if (empty($text_dne)) {
                //Slavnost Jezise Krista Krale
                $datum_1ne_adv_obj = $this->getDatum1NeAdvenObj($datum_obj);
                if (is_object($datum_1ne_adv_obj)) {
                    $den_test_int = intval($datum_obj->format('z'));
                    $den_1NeAdv_int = intval($datum_1ne_adv_obj->format('z'));
                    $rozdil_dnu_int = $den_1NeAdv_int - $den_test_int;
                    if ($rozdil_dnu_int == 7) {
                        $text_dne = 'Slavnost Ježíše Krista Krále';
                    }
                }
            }
        }
        return $text_dne;
    }

    //Svatky Pane
    //Krtu Pane (NE po 6.1.), Uvedeni Pane do chramu (2.2.), Promeneni Pane (6.8.)
    //Svatek Sv. Rodiny (NE v oktavu narozeni Pane neni-li, tak 30.12.)
    function jeToDenSkup5(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $datum_str = $datum_obj->format('j.n.');
            //Krtu Pane
            $datum_Krtu_Pane_obj = $this->getDatumKrtuPaneObj($datum_obj);
            if (is_object($datum_Krtu_Pane_obj)) {
                $datum_Krtu_Pane_str = $datum_Krtu_Pane_obj->format('j.n.');
                if ($datum_str == $datum_Krtu_Pane_str) {
                    $text_dne = 'Svátek Křtu Páně';
                }
            }
            if (empty($text_dne)) {
                if ($datum_str == '2.2.') {
                    $text_dne = 'Uvedení Páně do chrámu';
                }
            }
            if (empty($text_dne)) {
                if ($datum_str == '6.8.') {
                    $text_dne = 'Svátek Proměnění Páně';
                }
            }
            if (empty($text_dne)) {
                //Svatek sv.Rodiny
                $rok_str = $datum_obj->format('Y');
                $dat_svat_sv_rodiny_obj = new DateTime($rok_str.'-12-25');
                if (is_object($dat_svat_sv_rodiny_obj)) {
                    $dat_svat_sv_rodiny_obj->modify("+1 day");
                    $cisl_dne_sv_sv_rodiny_str = $dat_svat_sv_rodiny_obj->format('N');
                    switch ($cisl_dne_sv_sv_rodiny_str) {
                        case "7":
                            //echo "den je nedele, ponechame ho";
                            break;
                        case "6":
                            $dat_svat_sv_rodiny_obj->modify("+1 day");
                            break;
                        case "5":
                            $dat_svat_sv_rodiny_obj->modify("+2 day");
                            break;
                        case "4":
                            $dat_svat_sv_rodiny_obj->modify("+3 day");
                            break;
                        case "3":
                            $dat_svat_sv_rodiny_obj->modify("+4 day");
                            break;
                        case "2":
                            $dat_svat_sv_rodiny_obj->modify("+5 day");
                            break;
                        case "1":
                            //26.12. je v pondeli, svatek je 30.12.
                            $dat_svat_sv_rodiny_obj->modify("+4 day");
                            break;
                    }
                    $dat_svat_sv_rodiny_str = $dat_svat_sv_rodiny_obj->format('j.n.');
                    if ($datum_str == $dat_svat_sv_rodiny_str) {
                        $text_dne = 'Svátek Svaté rodiny';
                    }
                }
            }
        }
        return $text_dne;
    }

    //Nedele v dobe Vanocni a v mezidobi (2.NE po Narozeni Pane - nekdy neni)
    //
    function jeToDenSkup6(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $cis_dne_tydne_datum_str = $datum_obj->format('N');
            $datum_str = $datum_obj->format('j.n.');
            $den_roku_int = intval($datum_obj->format('z'));
            $datum_velik_obj = $this->getDatumVelikObj($datum_obj);
            if ($cis_dne_tydne_datum_str == '7') {
                //2.NE po narozeni Pane
                if (($datum_str == '2.1.') || ($datum_str == '3.1.') || ($datum_str == '4.1.') || ($datum_str == '5.1.')) {
                    $text_dne = '2. neděle po Narození Páně';
                } else {
                    $den_velik_int = intval($datum_velik_obj->format('z'));
                }
                if (empty($text_dne)) {
                    if (is_object($datum_velik_obj)) {
                        if (($den_roku_int > 5) && ($den_roku_int < ($den_velik_int - 41))) {
                            //NE v mezidobi pred velikonocemi
                            $datum_Krtu_Pane_obj = $this->getDatumKrtuPaneObj($datum_obj);
                            if (is_object($datum_Krtu_Pane_obj)) {
                                $den_krtu_Pane_int = intval($datum_Krtu_Pane_obj->format('z'));
                                $rozdil_dnu_int = $den_roku_int - $den_krtu_Pane_int;
                                $rozdil_tydnu_int = intval($rozdil_dnu_int / 7);
                                $cislo_ne_mezidobi_int = 1 + $rozdil_tydnu_int;
                                if (!empty($cislo_ne_mezidobi_int)) {
                                    $cis_ne_mezidobi_str = strval($cislo_ne_mezidobi_int);
                                    $text_dne = $cis_ne_mezidobi_str.'. neděle v mezidobí';
                                }
                            }
                        }
                    }
                }
                if (empty($text_dne)) {
                    if ($den_roku_int > ($den_velik_int + 55)) {
                        $datum1NeAdvenObj = $this->getDatum1NeAdvenObj($datum_obj);
                        $den_1NeAdven_int = intval($datum1NeAdvenObj->format('z'));
                        if (($den_1NeAdven_int - 7) > $den_roku_int ) {
                            $rozdil_dnu_int = $den_1NeAdven_int - $den_roku_int;
                            $rozdil_tydnu_int = intval($rozdil_dnu_int / 7);
                            $cislo_ne_mezidobi_int = 35 - $rozdil_tydnu_int;
                            if (!empty($cislo_ne_mezidobi_int)) {
                                $cis_ne_mezidobi_str = strval($cislo_ne_mezidobi_int);
                                $text_dne = $cis_ne_mezidobi_str.'. neděle v mezidobí';
                            }
                        }
                    }
                }
            }
        }
        return $text_dne;
    }

    //Svatky Panny Marie a svatych
    function jeToDenSkup7(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $den_str = $datum_obj->format('j');
            $mesic_str = $datum_obj->format('n');
            $query4 = ' SELECT * FROM #__svatky '.
                    '  WHERE den = "'.$den_str.'" AND mesic = "'.$mesic_str.'" AND stupen = "svat"';
            $this->_db->setQuery( $query4 );
            $svatek_obj = $this->_db->loadObject();
            if (is_object($svatek_obj)) {
                $text_dne = $svatek_obj->svatek;
            }
        }
        return $text_dne;
    }

    //Adventni vsedni dny od 17. do 24. prosince, dny v oktavu Narozeni Pane,
    //Vsedni dny doby postni
    //    function jeToDenSkup9(&$datum_obj) {
    //        $text_dne = '';
    //        if (is_object($datum_obj)) {
    //
    //        }
    //        return $text_dne;
    //    }

    //zavazne pamatky
    function jeToDenSkup10(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $den_str = $datum_obj->format('j');
            $mesic_str = $datum_obj->format('n');
            $query4 = ' SELECT * FROM #__svatky '.
                    '  WHERE den = "'.$den_str.'" AND mesic = "'.$mesic_str.'" AND stupen = "pam"';
            $this->_db->setQuery( $query4 );
            $svatek_obj = $this->_db->loadObject();
            if (is_object($svatek_obj)) {
                $text_dne = $svatek_obj->svatek;
            }
        }
        return $text_dne;
    }

    //nezavazne pamatky
    function jeToDenSkup12(&$datum_obj) {
        $text_dne = '';
        if (is_object($datum_obj)) {
            $den_str = $datum_obj->format('j');
            $mesic_str = $datum_obj->format('n');
            $query4 = ' SELECT * FROM #__svatky '.
                    '  WHERE den = "'.$den_str.'" AND mesic = "'.$mesic_str.'" AND stupen = "nezpam"';
            $this->_db->setQuery( $query4 );
            $svatek_obj = $this->_db->loadObject();
            if (is_object($svatek_obj)) {
                $text_dne = $svatek_obj->svatek;
            }
        }
        return $text_dne;
    }

    //    function jeToDenSkup13(&$datum_obj) {
    //        $text_dne = '';
    //        if (is_object($datum_obj)) {
    //
    //        }
    //        return $text_dne;
    //    }

    //ocekava objekt tridy DateTime,
    //vraci objekt tridy DateTime s datem velikonoc
    //roku predaneho datumu
    //pri selhani vraci null
    function getDatumVelikObj(&$datum_obj) {
        $datum_velik_obj = null;
        if (is_object($datum_obj)) {
            $rok_int = intval($datum_obj->format('Y'));
            if (!empty($rok_int)) {
                $jar_dnu_do_velik_int = easter_days($rok_int);
                $datum_velik_str = $datum_obj->format('Y').'-03-21';
                $datum_velik_obj = new DateTime($datum_velik_str);
                $datum_velik_obj->modify("+".$jar_dnu_do_velik_int." day");
            }
        }
        return $datum_velik_obj;
    }

    //ocekava objekt tridy DateTime,
    //vraci objekt tridy DateTime s datumem 1.nedele adventni
    //predaneho roku - pri selhani vraci null
    function getDatum1NeAdvenObj(&$datum_obj) {
        $datum_1ne_adv_obj = null;
        if (is_object($datum_obj)) {
            $rok_str = $datum_obj->format('Y');
            if (!empty($rok_str)) {
                $datum_4ne_adv_obj = new DateTime($rok_str.'-12-25');
                if (is_object($datum_4ne_adv_obj)) {
                    $datum_4ne_adv_obj->modify("-1 day");
                    $cis_dne_dat4NeAdv_int = intval($datum_4ne_adv_obj->format('N'));
                    while ($cis_dne_dat4NeAdv_int != 7) {
                        $datum_4ne_adv_obj->modify("-1 day");
                        $cis_dne_dat4NeAdv_int = intval($datum_4ne_adv_obj->format('N'));
                    }
                    //ziskame datum 1.nedele adventni
                    $datum_4ne_adv_obj->modify("-21 day");
                    $datum_1ne_adv_str = $datum_4ne_adv_obj->format('Y-m-d');
                    $datum_1ne_adv_obj = new DateTime($datum_1ne_adv_str);
                } else {
                    $chyba = 'Selhalo vytvoření datumu 25.12.';
                }
            }
        }
        return $datum_1ne_adv_obj;
    }

    //ocekava objekt tridy DateTime,
    //vraci objekt tridy DateTime s datumem Krtu Pane
    //predaneho roku - pri selhani vraci null
    function getDatumKrtuPaneObj(&$datum_obj) {
        $datum_krtu_Pane_obj = null;
        if (is_object($datum_obj)) {
            $rok_str = $datum_obj->format('Y');
            $datum_krtu_Pane_obj = new DateTime($rok_str.'-01-06');
            $datum_krtu_Pane_obj->modify("+1 day");
            $den_tydne_krtu_Pane_str = $datum_krtu_Pane_obj->format('N');
            while ($den_tydne_krtu_Pane_str != '7') {
                $datum_krtu_Pane_obj->modify("+1 day");
                $den_tydne_krtu_Pane_str = $datum_krtu_Pane_obj->format('N');
            }
        }
        return $datum_krtu_Pane_obj;
    }

    //ocekava objekt tridy DateTime,
    //zmeni predane datum na nejblizsi
    //nadchazejici pondeli
    //pri uspechu vraci true, jinak false
    function zmenDatumNaPondeli(&$dateTime_obj) {
        $uspech_bool = false;
        if (is_object($dateTime_obj)) {
            $cislo_dne_tydne_str = $dateTime_obj->format('N');
            if (!empty($cislo_dne_tydne_str)) {
                switch ($cislo_dne_tydne_str) {
                    case "1":
                        //echo "den je pondělí, ponechame ho";
                        $uspech_bool = true;
                        break;
                    case "2":
                        $dateTime_obj->modify("+6 day");
                        $uspech_bool = true;
                        break;
                    case "3":
                        $dateTime_obj->modify("+5 day");
                        $uspech_bool = true;
                        break;
                    case "4":
                        $dateTime_obj->modify("+4 day");
                        $uspech_bool = true;
                        break;
                    case "5":
                        $dateTime_obj->modify("+3 day");
                        $uspech_bool = true;
                        break;
                    case "6":
                        $dateTime_obj->modify("+2 day");
                        $uspech_bool = true;
                        break;
                    case "7":
                        $dateTime_obj->modify("+1 day");
                        $uspech_bool = true;
                        break;
                }
            }
        }
        if ($uspech_bool) {
            return true;
        } else {
            return false;
        }
    }

    //ocekava objekt tridy DateTime,
    //pokud tyden zacinajici stejnym datumem
    //jiz je v databazi, posunuje datum az
    //nalezne volny tyden
    //vraci true/false
    function existujeLiPosun(&$dateTime_obj) {
        $stejny_neexistuje_bool = false;
        if (is_object($dateTime_obj)) {
            //zkontrolujeme zda je datum pondeli, pripadne upravime
            $uspesna_zmena_bool = $this->zmenDatumNaPondeli($dateTime_obj);
            if ($uspesna_zmena_bool) {
                //zjistime zda tyden zacinajici stejnym pondelkem
                //jiz neni v databazi
                $cisl_ty_int = intval($dateTime_obj->format("W"));
                $rok_int = intval($dateTime_obj->format("Y"));
                $query5 = ' SELECT * FROM #__tydny '.
                    '  WHERE #__tydny.tyden_cislo = '.$cisl_ty_int. '
                        AND #__tydny.rok = '.$rok_int;
                $this->_db->setQuery( $query5 );
                $tyden_obj = $this->_db->loadObject();
                while (is_object($tyden_obj)) {
                    //dokud nenalezneme volny tyden navysujeme datum
                    $dateTime_obj->modify("+7 day");
                    $cisl_ty_int = intval($dateTime_obj->format("W"));
                    $rok_int = intval($dateTime_obj->format("Y"));
                    $query6 = ' SELECT * FROM #__tydny '.
                    '  WHERE #__tydny.tyden_cislo = '.$cisl_ty_int. '
                        AND #__tydny.rok = '.$rok_int;
                    $this->_db->setQuery( $query6 );
                    $tyden_obj = $this->_db->loadObject();
                }
                $stejny_neexistuje_bool = true;
            }
        }
        return $stejny_neexistuje_bool;
    }

    //pokud je v Requestu sablona_id,
    //ziska sablonu a vygeneruje z ni
    //ohlasky, ktere ulozi do databaze;
    //vraci true/false
    function generujOhlaskyZeSab(&$ode_dne_str, &$id) {
        $uspech_bool = false;
        $sablona_id = JRequest::getVar('sablona_id',  0, '', 'integer');
        if (!empty($sablona_id)) {
            //nacteme udalosti sablony do pole
            $udalosti_sablony_obj_list = $this->getUdalostiSablony($sablona_id);
            if (is_array($udalosti_sablony_obj_list)) {
                foreach ($udalosti_sablony_obj_list as $udalost_sabl_obj) {
                    $from = array( 'id' => null,
               'misto_id'  => $udalost_sabl_obj->misto_id,
               'tyden_id'  => $id,
               'datum' => $this->getDatumZeSab($ode_dne_str, $udalost_sabl_obj),
               'cas' => $udalost_sabl_obj->cas,
               'cas_konec' => $udalost_sabl_obj->cas_konec,
               'zvyrazneni'  => $udalost_sabl_obj->zvyrazneni,
               'hruby_popis' => $udalost_sabl_obj->hruby_popis
                    );
                    $ignore = 'id';
                    $table = $this->getTable( 'ohlasky' );
                    $table->bind( $from, $ignore );
                    if ($table->store()) {
                        //alespon jedna ohlaska byla ulozena
                        $uspech_bool = true;
                    }
                }
            }
        }
        return $uspech_bool;
    }

    //ocekava objekt tridy Tydny a objekt tridy Udalost_sabl,
    //vraci retezec ve tvaru 'YYYY-MM-DD' nebo
    //pri selhani prazdny retezec
    function getDatumZeSab(&$ode_dne_str, &$udalost_sabl_obj) {
        $datum_str = '';
        if (is_object($udalost_sabl_obj)) {
            $dateTime_obj = new DateTime($ode_dne_str);
            if (is_object($dateTime_obj)) {
                $den_tydne_sab = $udalost_sabl_obj->den_tydne;
                switch ($den_tydne_sab) {
                    case "PO":
                        //ponechame
                        break;
                    case "UT":
                        $dateTime_obj->modify("+1 day");
                        break;
                    case "ST":
                        $dateTime_obj->modify("+2 day");
                        break;
                    case "CT":
                        $dateTime_obj->modify("+3 day");
                        break;
                    case "PA":
                        $dateTime_obj->modify("+4 day");
                        break;
                    case "SO":
                        $dateTime_obj->modify("+5 day");
                        break;
                    case "NE":
                        $dateTime_obj->modify("+6 day");
                        break;
                }
                $datum_str = $dateTime_obj->format('Y-m-d');
            }
        }
        return $datum_str;
    }

    function getUdalostiSablony(&$sablona_id) {
        $sablona_id_int = intval($sablona_id);
        $udalosti_sabl_obj_list = null;
        if (!empty($sablona_id_int)) {
            $query = ' SELECT * FROM #__udalost_sabl '.
                    '  WHERE #__udalost_sabl.sablona_id = '.$sablona_id_int;

            $this->_db->setQuery( $query );
            $udalosti_sabl_obj_list = $this->_db->loadObjectList();
        }
        return $udalosti_sabl_obj_list;
    }

    function neniStejnehoData(&$ode_dne, &$id = 0) {
        $stejnyTydenOk_bool = true;
        $db =& JFactory::getDBO();
        if (!empty($ode_dne) && (empty($id))) {
            $query = 'SELECT * FROM #__tydny WHERE #__tydny.ode_dne ="'.$ode_dne.'"';
            $db->setQuery( $query );
            $stejneDatumTyden_obj = $db->loadObject();
            if (is_object($stejneDatumTyden_obj)) {
                $stejnyTydenOk_bool = false;
            }
        }
        if (!empty($ode_dne) && (!empty($id))) {
            $query = 'SELECT * FROM #__tydny WHERE #__tydny.ode_dne ="'.$ode_dne.'" AND NOT (#__tydny.id = '.$id.')';
            $db->setQuery( $query );
            $stejneDatumTyden_obj = $db->loadObject();
            if (is_object($stejneDatumTyden_obj)) {
                $stejnyTydenOk_bool = false;
            }
        }
        return $stejnyTydenOk_bool;
    }

}
